package org.duiduo.config.filter;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.duiduo.config.annotation.LogAop;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.Filter;
import org.noear.solon.core.handle.FilterChain;
import org.noear.solon.core.wrap.MethodWrap;

import java.util.Objects;

/**
 * 日志切面
 *
 * @author liangze
 * @date 2025/9/29 10:38
 */
@Slf4j
public class LogAspect implements Filter {

    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        MethodWrap method = ctx.action().method();
        LogAop logAop = method.getAnnotation(LogAop.class);
        if (Objects.isNull(logAop)) {
            chain.doFilter(ctx);
            return;
        }
        String title = logAop.title();
        // 请求路径
        String reqPath = method.getDeclaringClz().getName() + "." + method.getName();
        // 请求参数
        String reqDataMsg = StrUtil.isNotBlank(ctx.body()) ? StrUtil.cleanBlank(ctx.body()) : ctx.paramMap().toString();

        log.info("{} 请求地址:{} 请求路径:{} 请求参数:{}", title, ctx.path(), reqPath, reqDataMsg);
        chain.doFilter(ctx);

        // 返回参数 正常情况打印；如果异常，打印在全局过滤器那边 GlobalFilter
        String resultMsg = JSONUtil.toJsonStr(ctx.result);
        log.info("{} 请求地址:{} 请求路径:{} 返回参数:{}", title, ctx.path(), reqPath, resultMsg);
    }

}
